package com.kyk.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.kyk.entity.Users;
import com.kyk.mapper.UsersMapper;
import com.kyk.service.IUsersService;
import com.kyk.util.CodeUtil;
import com.kyk.util.JwtUtils;
import com.kyk.util.Result;
import com.kyk.util.Utils;
import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import java.time.LocalDateTime;

/**
 * <p>
 * 用户表 服务实现类
 * </p>
 *
 * @author 凯
 * @since 2025-09-12
 */
@Service
public class UsersServiceImpl extends ServiceImpl<UsersMapper, Users> implements IUsersService {
    @Autowired
    UsersMapper usersMapper;
    @Autowired
    JavaMailSender javaMailSender;
    @Value("${spring.mail.fromMail.addr}")
    String fromEmail;


    @Autowired
    JwtUtils jwtUtils;

    /**
     * 注册用户
     * @param users
     * @return
     */
    public Result addUser(Users users) {
        System.out.println(users);
        Utils.checkEmpty(users.getUsername(),"用户名不能为空")
                .checkEmpty(users.getPassword(),"密码不能为空")
                .checkEmpty(users.getPhone(),"手机号不能为空")
                .checkEmpty(users.getEmail(),"邮箱不能为空");
        // 密码加密
        users.setPassword(DigestUtils.md5DigestAsHex((users.getUsername() + users.getPassword()).getBytes()));
        users.setAvatarUrl("http://localhost/upload/head.jpg");
        users.setStatus( 1);
        users.setCreatedAt(LocalDateTime.now());
        int result = usersMapper.insert(users);
        if(result>0){
            return new Result(CodeUtil.ADD_OK,"注册成功");
        }
        return new Result(CodeUtil.ADD_ERROR,"注册失败");
    }


    /**
     * 发送验证码
     * @param email
     * @return
     */
    @Override
    public String sendCode(String email) {
        // 发送邮件
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(fromEmail);
        message.setTo(email);
        String code = System.currentTimeMillis() + "";
        code = code.substring(code.length() - 6);
        message.setSubject("验证码");
        message.setText("您的验证码为：" + code);
        javaMailSender.send(message);
        return code;
    }

    @Override
    public Result registerSendCode(String email){
        // 1. 先校验非空（最基础的参数校验）
        Utils.checkEmpty(email, "邮箱不能为空");
        // 校验邮箱是否存在
        LambdaQueryWrapper<Users> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Users::getEmail, email);
        Users user = usersMapper.selectOne(queryWrapper);
        if(user!=null){
            return new Result(CodeUtil.SEND_CODE_ERROR,"邮箱已被注册");
        }
        // 发送邮件
        String code = sendCode(email);
        return new Result(CodeUtil.SEND_CODE_OK,"验证码发送成功",code);
    }



    /**
     * 重置密码发送验证码
     * @param email
     * @return
     */
    @Override
    public Result resetSendCode(String email) {
        // 1. 先校验非空（最基础的参数校验）
        Utils.checkEmpty(email, "邮箱不能为空");
        // 校验邮箱是否存在
        LambdaQueryWrapper<Users> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Users::getEmail, email);
        Users user = usersMapper.selectOne(queryWrapper);
        if(user==null){
            return new Result(CodeUtil.SEND_CODE_ERROR,"邮箱未被注册");
        }
        // 发送邮件
        String code = sendCode(email);
        return new Result(CodeUtil.SEND_CODE_OK,"验证码发送成功",code);
    }


    /**
     * 登录
     * @param users
     * @return
     */
    @Override
    public Result login(Users users) {
        // 1. 先校验非空（最基础的参数校验）
        Utils.checkEmpty(users.getUsername(), "用户名不能为空")
                .checkEmpty(users.getPassword(), "密码不能为空");

        // 2. 计算加密后的密码（提前处理，避免重复计算）
        String encryptedPassword = DigestUtils.md5DigestAsHex(
                (users.getUsername() + users.getPassword()).getBytes()
        );

        // 3. 查询用户（仅通过用户名查询，不包含密码条件，便于后续区分错误类型）
        Users user = usersMapper.selectOne(
                new LambdaQueryWrapper<Users>()
                        .eq(Users::getUsername, users.getUsername())
        );

        // 4. 先判断用户是否存在
        if (user == null) {
            return new Result(CodeUtil.QUERY_ERROR, "用户不存在"); // 不明确提示，避免信息泄露
        }

        // 5. 再判断用户状态（存在但禁用，无需校验密码）
        if (user.getStatus() == 0) {
            return new Result(CodeUtil.QUERY_ERROR, "用户已禁用");
        }

        // 6. 最后校验密码（最敏感的逻辑放在最后）
        if (!user.getPassword().equals(encryptedPassword)) {
            return new Result(CodeUtil.QUERY_ERROR, "用户名或密码错误");
        }

        // 7. 登录成功
        String id = user.getId().toString();
        //生成jwt令牌
        String token = jwtUtils.generateToken(Long.parseLong(id),"USER");
        System.out.println(token);
        return new Result(CodeUtil.QUERY_OK, "登录成功", token);
    }

    /**
     * 重置密码
     * @param users
     * @return
     */
    @Override
    public Result resetPassword(Users users) {
        // 1. 先校验非空（最基础的参数校验）
        Utils.checkEmpty(users.getEmail(), "邮箱不能为空")
                .checkEmpty(users.getPassword(), "密码不能为空");
        // 2. 校验邮箱是否存在
        LambdaQueryWrapper<Users> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Users::getEmail, users.getEmail());
        Users user = usersMapper.selectOne(queryWrapper);
        if(user==null){
            return new Result(CodeUtil.UPDATE_ERROR,"邮箱未被注册");
        }

        // 4. 重置密码
        user.setPassword(DigestUtils.md5DigestAsHex((user.getUsername() + users.getPassword()).getBytes()));
        usersMapper.updateById(user);
        return new Result(CodeUtil.UPDATE_OK,"密码重置成功");
    }

    @Override
    public Result getCurrentUser(Long userId, String userType) {
        // 额外校验：确保用户类型正确（可选，增强安全性）
        if (!"USER".equals(userType)) {
            return new Result(CodeUtil.PERMISSION_DENIED, "权限错误");
        }
        Users user = usersMapper.selectById(userId);
        return new Result(CodeUtil.QUERY_OK, "查询成功", user);
    }


}
